#include "ConexionTracker.h"
#include "Funciones.h"

ConexionTracker::ConexionTracker() {

}

ConexionTracker::~ConexionTracker() {

}

bool ConexionTracker::enviar(const string &s) const {

	this->socket.send(s.c_str(), s.size());
	return true;
}

bool ConexionTracker::recibir(string &s) const {

	char buffer[MAX_TAMANIO_BUFFER];
	int recibidoCorrecto;
	string codigoDeEstado;
	int tamanioMensaje  = -1;
	Funciones fun;
    s = "";

	/* Primero recibo el encabezado HTTP */

	this->socket.recv(buffer,TAMANIO_HTTP_HEADER);
	buffer[TAMANIO_HTTP_HEADER] = '\0';

	string http = buffer;

    if (((http != "HTTP/1.0") && (http != "HTTP/1.1"))){
		cerr << "Error : Al intentar recibir." << endl;
    	return false;
	}

    /* Leo el codigo de estado de la respuesta del tracker */

    /* Primero recibo los espacios */

    recibidoCorrecto = this->socket.recv(buffer,1);

    if ( recibidoCorrecto != true) {
		cerr << "Error : Al intentar recibir." << endl;
    	return false;
    }

    while ( buffer[0] == ' ') {

        recibidoCorrecto = this->socket.recv(buffer,1);

        if ( recibidoCorrecto != true) {
    		cerr << "Error : Al intentar recibir." << endl;
        	return false;
        }
    }

    recibidoCorrecto = this->socket.recv(&buffer[1],2);;

    if ( recibidoCorrecto != true ) {
    	cerr << "Error : Al intentar recibir." << endl;
    	return false;
    }

    codigoDeEstado.append(buffer,3);

    if ( codigoDeEstado[0] != '2') {
    	cerr << " Error : " << codigoDeEstado << endl;
    }

    recibidoCorrecto = this->socket.recv(buffer,1);

    /* Leo toda la primer linea del mensaje */
    while ( buffer[0] != '\n') {

        recibidoCorrecto = this->socket.recv(buffer,1);

        if ( recibidoCorrecto != true) {
    		cerr << "Error : Al intentar recibir." << endl;
        	return false;
        }
    }

    /* Leo los encabezados del mensaje */

    /* Leo los encabezados */

    while ( true ) {

    	string lineaEncabezado;
    	string nombreEncabezado;
    	string datoEncabezado;

        recibidoCorrecto = this->socket.recv(buffer,1);

        if ( recibidoCorrecto != true) {
    		cerr << "Error : Al intentar recibir." << endl;
        	return false;
        }

    	if ( buffer[0] == '\r') {
    		//significa que encontro la linea nula y luego viene el cuerpo del mensaje.
            recibidoCorrecto = this->socket.recv(buffer,1); // leo el '\n'

            if ( recibidoCorrecto != true) {
        		cerr << "Error : Al intentar recibir." << endl;
            	return false;
            }
    		break;
    	}

    	/* leo la linea del encabezado actual */
    	while ( buffer[0] != '\n') {
    		lineaEncabezado.append(buffer,1);
            recibidoCorrecto = this->socket.recv(buffer,1);

            if ( recibidoCorrecto != true) {
        		cerr << "Error : Al intentar recibir." << endl;
            	return false;
            }
    	}

    	stringstream ss(lineaEncabezado);
    	getline(ss,nombreEncabezado,':');
    	getline(ss,datoEncabezado,'\r');

    	nombreEncabezado = fun.toUpperCase(nombreEncabezado);
    	datoEncabezado = fun.toUpperCase(datoEncabezado);

    	string nombreEncabezadoSinEspacios = fun.quitarLetra(' ',nombreEncabezado);
    	string datoEncabezadoSinEspacios = fun.quitarLetra(' ',datoEncabezado);

     	if ( nombreEncabezadoSinEspacios == "CONTENT-TYPE") {
    	  if (datoEncabezadoSinEspacios != "TEXT/PLAIN") {
    		 cerr << "Error: El tipo de Contenido no es soportado. " << endl;
    		 return false;
    		}
    	} else if ( nombreEncabezadoSinEspacios == "CONTENT-LENGTH") {
    		tamanioMensaje = fun.stringToInt(datoEncabezado);
    	}
    }

    if ( tamanioMensaje < 0) {
    	cerr << "Error: Al intentar recibir " << endl;
    	return false;
    }

    char* mensaje = new char[tamanioMensaje];
    recibidoCorrecto = this->socket.recv(mensaje,tamanioMensaje);

    if ( recibidoCorrecto != true) {
    	delete[] mensaje;
    	return false;
    }
    s.append(mensaje,tamanioMensaje);

    delete[] mensaje;

    return true;
}
